

package proyectodatos1verano.modelo;


public class Wordnament implements NodoBacktracking{
    public static Lista vocabulario;
    public static Lista matriz;
    public static String[][] wordnament;
    public static int tamX;
    public static int tamY;
    public int posX;
    public int posY;
    public Lista letrasRecorrido;
    public static Lista indices;
    public Palabra miPalabra;
    public Pila miPila;
    public Wordnament(Lista vocabulario, Lista matriz){
        this.vocabulario= vocabulario;
        
        this.matriz= matriz;
        llenaMatriz();
        letrasRecorrido= new Lista();
        posX=0;
        posY=0;
        miPalabra= new Palabra();
        miPila= new Pila();
        llenaPilaInicial();
        indices=vocabulario.devuelveIndices();
        
        
    }
    public Pila pilaInicial(){
        return miPila;
    }
    
    private void llenaPilaInicial(){
        Palabra nPalabra=null;
        Lista lRecorrido=null;
        
        for (int i = 0; i < tamX; i++) {
            for (int j = 0; j < tamY; j++) {
                nPalabra= new Palabra(wordnament[i][j], i, j);
                lRecorrido= new Lista();
                lRecorrido.add(nPalabra);
                miPila.push(new Wordnament(i, j, lRecorrido, nPalabra));
            }
        }
        
    }
    
    public Wordnament(int posX, int PosY,Lista letrasRecorrido, Palabra miPalabra){
        this.posX= posX;
        this.posY=PosY;
        this.letrasRecorrido=(Lista) letrasRecorrido.clone();
        
        this.miPalabra=miPalabra;
        this.letrasRecorrido.add(miPalabra);
        
    }
    private void llenaMatriz(){
       tamX=Integer.parseInt((String) matriz.get(0));
       tamY=Integer.parseInt((String) matriz.get(1));
       int tam= matriz.size();
       int xx=0;
       wordnament= new String[tamX][tamY];
       for(int i=2; i<tam; i++){
           String a= (String) matriz.get(i);
           String[] linea= a.split(",");
           
           for (int j = 0; j < linea.length; j++) {
               wordnament[xx][j]=linea[j];
           }
           xx++;
       }
       
    }
    public void imprimeMatriz(){
        for (int i = 0; i < tamX; i++) {
            for (int j = 0; j < tamY; j++) {
                System.out.print(wordnament[i][j]+" ");
            }
            System.out.println("");
        }
    }
    
    
    @Override
    public boolean esSolucion() {
//        boolean a=  buscaEnDiccionario(this.miPalabra.getPalabra());
        
        return buscaEnDiccionario(this.miPalabra.getPalabra());
    }
    
    public boolean buscaEnDiccionario(String palabra){
        
           
        return vocabulario.contains(palabra);
    }

    
    
    
    @Override
    public Pila getHijos() {
        Pila pl= new Pila();
        int total=tamX*tamY;
        String nueva=null;
        Palabra nPalabra=null;
        if(miPalabra.getPalabra().length()< total){
            if(validaPosicion( posX +1 , posY + 1 ) ){
                nueva=miPalabra.getPalabra()+wordnament[posX+1][posY+1];
                if(esIndice(nueva)|nueva.length()>5|nueva.length()<5){
                    nPalabra=new Palabra(nueva, posX+1, posY+1);
                    pl.push(new Wordnament(posX +1 ,posY + 1, letrasRecorrido,nPalabra));
                }
            }//x1
            if(validaPosicion( posX , posY + 1 ) ){
                nueva=miPalabra.getPalabra()+wordnament[posX][posY+1];
                if(esIndice(nueva)|nueva.length()>5|nueva.length()<5){
                    nPalabra=new Palabra(nueva, posX, posY+1);
                    pl.push(new Wordnament(posX  , posY + 1, letrasRecorrido,nPalabra));
                }
            }//x2
            if(validaPosicion( posX + 1 , posY  ) ){
                nueva=miPalabra.getPalabra()+wordnament[posX+1][posY];
                if(esIndice(nueva)|nueva.length()>5|nueva.length()<5){
                    nPalabra=new Palabra(nueva, posX+1, posY);
                    pl.push(new Wordnament(posX + 1 , posY , letrasRecorrido,nPalabra));
                }
            }//x3
            if(validaPosicion( posX -1 , posY - 1 ) ){
                nueva=miPalabra.getPalabra()+wordnament[posX-1][posY-1];
                if(esIndice(nueva)|nueva.length()>5|nueva.length()<5){
                    nPalabra=new Palabra(nueva, posX-1, posY-1);
                    pl.push(new Wordnament(posX - 1 , posY - 1, letrasRecorrido,nPalabra));
                }
            }//x4
            if(validaPosicion( posX -1 , posY  ) ){
                nueva=miPalabra.getPalabra()+wordnament[posX-1][posY];
                if(esIndice(nueva)|nueva.length()>5|nueva.length()<5){
                    nPalabra=new Palabra(nueva, posX-1, posY);
                    pl.push(new Wordnament(posX -1 , posY , letrasRecorrido,nPalabra));
                }
            }//x5
            if(validaPosicion( posX , posY - 1 ) ){
                nueva=miPalabra.getPalabra()+wordnament[posX][posY-1];
                if(esIndice(nueva)|nueva.length()>5|nueva.length()<5){
                    nPalabra=new Palabra(nueva, posX, posY-1);
                    pl.push(new Wordnament(posX  , posY - 1, letrasRecorrido,nPalabra));
                }
            }//x6
            if(validaPosicion( posX -1 , posY + 1 ) ){
                nueva=miPalabra.getPalabra()+wordnament[posX-1][posY+1];
                if(esIndice(nueva)|nueva.length()>5|nueva.length()<5){
                    nPalabra=new Palabra(nueva, posX-1, posY+1);
                    pl.push(new Wordnament(posX - 1 , posY +1, letrasRecorrido,nPalabra));
                }
            }//x7
            if(validaPosicion( posX +1 , posY - 1 ) ){
                nueva=miPalabra.getPalabra()+wordnament[posX+1][posY-1];
                if(esIndice(nueva)|nueva.length()>5|nueva.length()<5){
                    nPalabra=new Palabra(nueva, posX+1, posY-1);
                    pl.push(new Wordnament(posX +1 , posY - 1, letrasRecorrido,nPalabra));
                }
            }
        }
        return pl;
    }
    
    public boolean esIndice(String aProbar){
        if(aProbar.length()<=5&&aProbar.length()>=3){
            
            
            int ca=indices.BSearch(aProbar);
            if(ca>-1){
                
                return true;
            }
        }
        
        return false;
    }
    
    public boolean validaPosicion(int x,int y){
//        boolean a= 0 <= x && x < tamX && 0 <= y && y < tamY && (posExiste(x, y)==false);
//        System.out.println(a);
       
        return 0 <= x && x < tamX && 0 <= y && y < tamY && (posExiste(x, y)==false);
    }
    public boolean posExiste(int x, int y){
        //letrasRecorrido.imprimirUltimo();
        for(int i=0; i<this.letrasRecorrido.size();i++ ){
            Palabra p=(Palabra) letrasRecorrido.get(i);
            if(x==p.getX()&&y==p.getY())return true;
        }
        
        return false;
    }
    @Override
    public String toString(){
    
        return miPalabra.getPalabra();
    }
    
}
